\documentclass[UTF8]{ctexart}
\input{../latexstyle/manual.sty}

\title{Manipula指令手册}
\author{}
\date{}

\begin{document}
\maketitle

\section{aliasio}

\subsection*{功能}

\verb|aliasio|用于将控制器的命名IO信号源定义为Tenon中的IO信号变量。必须在使用其它IO信号函数前使用
\verb|aliasio|设置Tenon中的IO信号变量。对于不同的Task，如果用到了同一个命名IO信号源，则需要在各自的Task
中，分别使用\verb|aliasio|指令定义各自任务中的IO信号变量。

\subsection*{原型}
\begin{verbatim}
void aliasio(ref anytype sig, string cfgio)
\end{verbatim}

\subsubsection*{sig}
信号源被定义成的信号变量。此信号变量必须已经在Tenon程序中进行了声明。信号变量的类型可以是
signalxx中的任一个，且需要和信号源的类型一致。

\subsubsection*{cfgio}
控制器配置中的信号源的名称。此信号源必须已经在控制器中进行了配置。

\subsection*{例子}
\begin{verbatim}
    var signaldi di1;
    aliasio("board_g15", di1);
\end{verbatim}

该程序片段将控制器配置中的\verb|board_g15|信号源定义为Tenon程序中的di1变量。在此后的程序中，di1可用于中
断、waitdi等指令。

\section{confj}
\subsection*{功能}
默认为on模式，目前不能关闭，因为关闭机器人运行中的构型监控，会引起机器人的急速旋转，造成不可预料的后果。

当设置为on时，movej移动到目标指定的位姿和构形。

当设置为off时，movej移动到目标指定的位姿，忽略构形。达到的构形是与当前构形最接近的构形。但是构型的cf1字段不允许发生变化。

\section{confl}
\subsection*{功能}
默认为on模式，目前不能关闭。因为关闭机器人运行中的构型监控，会引起机器人的急速旋转，造成不可预料的后果。

confl(Configuration Linear)指令用来指定是否在movel和movec过程中监控机器人的构型。构型数据的定义见confdata.

\subsection*{程序执行}
在机器人移动时，控制器会选择与当前构型最为接近的下一个构型。

如果控制器发现机器人无法达到指令目标点的构形时，会立刻停止机器人的运动。

此外，会检查movel和movec指令运动过程中构形的变化是否违反了规则。

对于6轴机器人，在movel和movec运动过程中，构形变化规则是：
\begin{itemize}
  \item 1,4,6轴的变化不能超过180度
  \item cfx不能发生变化。cfx的定义请查看《数据类型手册》里的confdata条目。
\end{itemize}

当设置为false时，movel只移动到目标点的位姿，忽略构形。

\section{movec}

\subsection*{功能}

当工具被机器人持有，工件固定时，movec用于将工具中心点(tool center point, TCP)沿圆弧移动到指定目标。

当工件被机器人持有，工具固定时，movec用于让机械臂带动工件将指定的目标点沿圆弧移动到工具中心点。

\subsection*{原型}
\begin{verbatim}
void movec(robtarget cirpoint, robtarget topoint,
           speeddata speed, zonedata zone, tooldata tool,
           wobjdata wobj = void)
\end{verbatim}

\subsubsection*{cirpoint}
指定圆弧点的位置。cirpoint的方向不会被精确插值，它用来指定旋转的方向。因为在从起点向目标点的运动过程中，
方向的变化有两种方式，一种是沿着大圆的短边变化，另一种是沿着大圆的长边变化。机器人会走大圆靠近cirpoint方向的那边。

\subsubsection*{topoint}
指定圆弧的目标点。

\subsubsection*{speed}
指定运动的速度。

\subsubsection*{zone}
指定到达点的经过方式。

\subsubsection*{tool}
指定tooldata。

\subsubsection*{wobj}
可选参数，指定工件数据。

\subsection*{例子}
movec(p1, p2, v500, z30, tool1);

将tool1定义的TCP沿圆弧以速度v500经过圆周点p1移动至目标点p2，转弯区域定义为z30.

\subsection*{错误检查}

\subsubsection*{对指令涉及的点的约束}

\begin{itemize}
  \item 起始点和目标点的最小距离是0.1mm
  \item 起始点和圆弧点的最小距离是0.1mm
  \item 圆弧点和目标点的最小距离是0.1mm
  \item 形成的圆弧的角度不能超过240度
  \item 圆弧点必须位于圆弧的中间部分，具体来说就是位于圆弧长度的25\%到75\%之间
\end{itemize}

\section{movej}

\subsection*{功能}
当工具被机器人持有，工件固定时，movej用于将工具中心点(tool center point, TCP)沿关节空间的最短路径移
动到目标位置，所有轴同时达到目标位置。

当工件被机器人持有，工具固定时，movel用于让机械臂带动工件将指定的目标点沿关节空间的最短路径移动到工
具中心点，所有轴同时达到目标位置。

\subsection*{原型}
\begin{verbatim}
void movej(robtarget topoint, speeddata speed, zonedata zone, 
           tooldata tool, wobjdata wobj = void)
\end{verbatim}

\subsubsection*{topoint}
指定目标点。

\subsubsection*{speed}
指定运动的速度。

\subsubsection*{zone}
指定到达点的经过方式。

\subsubsection*{tool}
指定tooldata。

\subsubsection*{wobj}
可选参数，指定工件数据。

\subsection*{例子}
movej(p1, v1000, z30, tool2);

将tool2定义的TCP沿关节空间的最短路径以速度v1000移动至目标p1，转弯区域定义为z30。

\subsection*{错误检查}

\subsubsection*{强制精确达到}
如果指令起点和终点的间距小于参数\verb|fine_point_tolerance|定义的距离，则指令强
制将目标点的区域改为fine，精确到达。

\section{movel}

\subsection*{功能}
当工具被机器人持有，工件固定时，movel用于将工具中心点(tool center point, TCP)沿直线移动到指定目标。
当目标位置与当前TCP位置重合时，movel相当于将工具进行重定向。

当工件被机器人持有，工具固定时，movel用于让机械臂带动工件将指定的目标点沿直线移动到工具中心点。

\subsection*{原型}
\begin{verbatim}
void movel(robtarget topoint, speeddata speed, zonedata zone, 
           tooldata tool, wobjdata wobj = void)
\end{verbatim}

\subsubsection*{topoint}
指定目标点。

\subsubsection*{speed}
指定运动的速度。

\subsubsection*{zone}
指定到达点的经过方式。

\subsubsection*{tool}
指定tooldata。

\subsubsection*{wobj}
可选参数，指定工件数据。

\subsection*{例子}
\begin{verbatim}
  movel(p1, v1000, z30, tool2);
\end{verbatim}

将tool2定义的TCP沿直线以速度v1000移动至目标p1, 转弯区域定义为z30. 

\subsection*{错误检查}
\subsubsection*{原地转向检查}
如果指令移动的距离小于参数\verb|in_position_tolerance|定义的距离，则指令执行TCP原地转向。

\subsubsection*{强制精确达到}
如果指令移动的距离小于参数\verb|fine_point_tolerance|定义的距离，则指令强制将目标点的区域改为fine，精确到达。

\section{moveabsj}

\subsection*{功能}
moveabsj用于将机械臂的各关节移动至目标位置，机械臂的所有关节同时达到目标位置。

该指令适用于目标点是奇异点的情况。

\subsection*{原型}
\begin{verbatim}
void moveabsj(jointtarget toJointPos, speeddata speed, zonedata zone, 
              tooldata tool, wobjdata wobj = void)
\end{verbatim}

\subsubsection*{toJointPos}
指定机械臂各关节的位置。

\subsubsection*{speed}
指定运动的速度。

\subsubsection*{zone}
指定到达点的经过方式。

\subsubsection*{tool}
指定tooldata。

\subsubsection*{wobj}
可选参数，指定工件数据。

\subsection*{例子}
\begin{verbatim}
moveabsj(p1, v1000, z30, tool2);
\end{verbatim}

机械臂携带tool2沿关节空间的最短路径以速度v1000移动至关节位置p1，转弯区域定义为z30。

\subsection*{错误检查}
检查各关节位置是否超出运动范围。

\subsubsection*{强制精确达到}
如果指令起点和终点的间距小于参数\verb|fine_point_tolerance|定义的距离，则指令强
制将目标点的区域改为fine，精确到达。

\section{cirpathmode}

\subsection*{功能}
cirpathmode用于指定机械臂TCP在圆弧运动中重新定向的方式。

通过设置不同的模式，可以调用不同的插值方法，从而决定机械臂TCP在经过圆弧点时是否与圆弧点的编程方向对
齐。

该指令只对路径中后续的movec指令有效。

\subsection*{原型}
\begin{verbatim}
void cirpathmode(pathmode mode)
\end{verbatim}

\subsubsection*{pathframe}
在此模式下，机械臂TCP在经过圆弧点时不需要与圆弧点编程方向对齐。通过对圆弧起点和终点在路径坐标系中的
方向进行插值计算TCP的方向。

该值为系统默认值。

\subsubsection*{objectframe}
在此模式下，机械臂TCP在经过圆弧点时不需要与圆弧点编程方向对齐。通过对圆弧起点和终点在机械臂基坐标系
中的方向进行插值计算TCP的方向。

\subsubsection*{cirpointori}
在此模式下，机械臂TCP在经过圆弧点时需要与圆弧点编程方向对齐。当TCP位于起点和圆弧点之间时，通过对圆弧
起点和圆弧点在路径坐标系中的方向进行插值计算TCP的方向，当TCP位于圆弧点和终点之间时，通过对圆弧点和终
点在路径坐标系中的方向进行插值计算TCP的方向。

\subsection*{例子}
\begin{verbatim}
  cirpathmode(pathmode::cirpointori)
\end{verbatim}

将cirpathmodel修改为cirpointori模式。

\subsection*{错误检查}

当为cirpointori模式时，圆弧点必须位于圆弧长度的25\%到75\%之间。

\section{setdo}

\subsection*{功能}
setdo指令用于修改DO信号的值，并且可以指定延时执行时间和是否同步执行。

如果delay和sync都没有被指定，则程序在调用修改信号值的函数后会尽早返回，不管实际信号值是否发生了改变。
如果有连续两条setdo指令对同一信号值做修改，并且前一条的setdo指令指定了delay参数，则在后一条setdo指令执行时，
如果前一条setdo指令的delay时间还没有到达，则前一条setdo指令会被取消执行。

\subsection*{原型}
\begin{verbatim}
void setdo(ref signaldo out, num val)
\end{verbatim}

\subsubsection*{sig}
需要修改信号值的DO信号变量。信号变量需要通过\verb|aliasio|指令与控制器中的信号源建立联
系，详见\verb|aliasio|指令。

\subsubsection*{val}
DO信号被修改为的值。该值只能为0 或 1.

\subsection*{例子}
\begin{verbatim}
    ! 将do1信号设置为1
    setdo(do1, 1);
\end{verbatim}

\section{waitdi}

\subsection*{功能}
waitdi用于暂停运行当前程序，直到某信号符合一定的条件。

\subsection*{原型}
\begin{verbatim}
void waitdi(ref signaldi di, num val)
\end{verbatim}

\subsubsection*{sig}
程序暂停运行时，需要等待变化的信号变量。信号变量需要通过\verb|aliasio|指令与控制器中的信号源建
立联系，详见\verb|aliasio|指令。

\subsubsection*{val}
程序暂停运行时，需要等待变化的信号变量所要符合的值。该值只能为0 或 1.

\subsection*{例子}
\begin{verbatim}
    ! 等待di1信号转变为1
    waitdi(di1, 1);
\end{verbatim}

\end{document}
